home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / 0Utils13.lha / 0Utils / ExpandArgs.c < prev    next >
C/C++ Source or Header  |  1995-03-20  |  4KB  |  170 lines

  1.  
  2. /******************************************************************************
  3.  
  4.     MODULE
  5.     ExpandArgs.c
  6.  
  7.     DESCRIPTION
  8.     Does expanding of all arguments, that
  9.     contain wildcards and passing of all
  10.     other arguments.
  11.  
  12.     NOTES
  13.     Kickstart 2.0+ required
  14.     compiles w/ SAS/C v6.51
  15.  
  16.     BUGS
  17.     'ExpandArgs test c:b#? xyz' produced one
  18.     $80000004 when compiled w/ OPTIMIZE !???
  19.  
  20.     TODO
  21.     !TESTING!
  22.  
  23.     EXAMPLES
  24.     > ExpandArgs c:f#? xyz
  25.     c:Filenote
  26.     xyz
  27.  
  28.     SEE ALSO
  29.     dos.library/MatchFirst, dos.library/MatchNext
  30.  
  31.     INDEX
  32.  
  33.     HISTORY
  34.     12-02-95 b_noll created
  35.     20-02-95 b_noll restructured source
  36.     21-02-95 b_noll added version/format-prefix/offset
  37.     20-03-95 b_noll added args diagnostics
  38.  
  39.     AUTHOR
  40.     Bernd Noll, Brunnenstrasse 55, D-67661 Kaiserslautern
  41.     b_noll@informatik.uni-kl.de
  42.  
  43. ******************************************************************************/
  44.  
  45. /**************************************
  46.         Includes
  47. **************************************/
  48.  
  49. #ifndef   EXEC_LIBRARIES_H
  50. # include <exec/libraries.h>
  51. #endif /* EXEC_LIBRARIES_H */
  52.  
  53. #ifndef   CLIB_EXEC_PROTOS_H
  54. # include <clib/exec_protos.h>
  55. #endif /* CLIB_EXEC_PROTOS_H */
  56.  
  57. #ifndef   DOS_DOS_H
  58. # include <dos/dos.h>
  59. #endif /* DOS_DOS_H */
  60.  
  61. #ifndef   CLIB_DOS_PROTOS_H
  62. # include <clib/dos_protos.h>
  63. #endif /* CLIB_DOS_PROTOS_H */
  64.  
  65. #include <proto/dos.h>
  66. #include <proto/exec.h>
  67.  
  68. /**************************************
  69.      Defines & Structures
  70. **************************************/
  71.  
  72. #ifndef ABSEXECBASE
  73. #define ABSEXECBASE ((struct ExecBase **)4L)
  74. #endif
  75.  
  76. struct _arg {
  77. /* ******************** USER FORMAT ******************** */
  78. #define FORMAT "/A/M"
  79.  
  80.     STRPTR *par;
  81.  
  82. #define MYFLAGS      /* (APF_DOWILD|) APF_DODOT| APF_FollowHLinks| */ 0
  83. #define LFORMAT "%s\n"
  84.  
  85. /* ******************** USER FORMAT ******************** */
  86. }; /* struct _argv */
  87.  
  88. #define MAXPATHLEN 256
  89. #define MAXLINELEN 256
  90.  
  91. #define VERSIONPREFIX    "\0$VER: "
  92. #define VERSIONOFFSET    0
  93. #define FORMATPREFIX    "\0$ARG: "
  94. #define FORMATOFFSET    7
  95.  
  96. /**************************************
  97.         Implementation
  98. **************************************/
  99.  
  100. long _main (void)
  101. {
  102.     const char* version = VERSIONPREFIX "ExpandArgs 1.2 " __AMIGADATE__ + VERSIONOFFSET;
  103.     long retval = RETURN_FAIL;
  104.     struct ExecBase*SysBase = *ABSEXECBASE;
  105.     struct Library* DOSBase;
  106.  
  107.     if (DOSBase = OpenLibrary (DOSNAME, 37)) {
  108.     struct _arg argv = { 0 };
  109.     APTR   args;
  110.     retval     = RETURN_ERROR;
  111.     if (args = (void*)ReadArgs(FORMATPREFIX FORMAT + FORMATOFFSET, (LONG*)&argv, NULL)) {
  112. /* ******************** USER BODY ******************** */
  113.  
  114.         BPTR stdout;
  115.         LONG   error;
  116.         STRPTR pat;
  117.         //STRPTR lformat = LFORMAT;
  118. #define lformat LFORMAT
  119.         int    i;
  120.         struct AnchorPath  *ap;
  121.         UBYTE  apb[sizeof (*ap) + 8 + MAXPATHLEN];
  122.         //UBYTE  buffer[MAXPATHLEN];
  123.  
  124.         retval = RETURN_OK;
  125.         stdout = Output();
  126.  
  127.         ap              = (void *)(((ULONG)apb + 7) & ~7);
  128.         ap->ap_Strlen     = MAXPATHLEN;
  129.         ap->ap_BreakBits  = 0;
  130.         ap->ap_FoundBreak = 0;
  131.         //ap->ap_ = ;
  132.  
  133.  
  134.         for (i = 0; pat = argv.par[i]; i++) {
  135.  
  136.         ap->ap_Flags  = MYFLAGS;
  137.  
  138.         for (error = MatchFirst(pat, ap); error == 0; error = MatchNext(ap)) {
  139.             FPrintf (stdout, lformat, ap->ap_Buf);
  140. //FPrintf(Output(), "%ld\n", j++);
  141.         } /* for */
  142.         MatchEnd(ap);
  143.  
  144.         if (error != ERROR_NO_MORE_ENTRIES) { /* abnormal error */
  145.             if ((error == ERROR_OBJECT_NOT_FOUND) && !(ap->ap_Flags & APF_ITSWILD)) {
  146.             FPrintf (stdout, lformat, pat);
  147.             } else {
  148.             retval = RETURN_ERROR;
  149.             break;
  150.             } /* if */
  151.         } /* if */
  152.         } /* for */
  153.  
  154. /* ******************** USER BODY ******************** */
  155.         FreeArgs (args);
  156.     } /* if */
  157.  
  158.     if (retval > RETURN_WARN)
  159.         PrintFault(IoErr(), "ExpandArgs");
  160.  
  161.     CloseLibrary (DOSBase);
  162.     } /* if */
  163.     return (retval);
  164. } /* _main */
  165.  
  166. /******************************************************************************
  167. *****  END ExpandArgs.c
  168. ******************************************************************************/
  169.  
  170.